package com.byron.pss.template;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 处理javabean，返回多行数据
 * @author Byron
 *
 * @param <T>
 */
public class BeanListHandler<T> implements IResultHandler<List<T>> {

	private Class<T> type;
	private List<T> list;

	public BeanListHandler(Class<T> type) {
		this.type = type;
	}

	@Override
	public List<T> handle(ResultSet rs) throws Exception {
		// 通过内省机制，给T的对象赋值
		list = new ArrayList<>();
		while (rs.next()) {
			T obj = (T) type.newInstance();
			BeanInfo beanInfo = Introspector.getBeanInfo(type, Object.class);
			PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
			for (PropertyDescriptor ps : pds) {
				// 拿到setter方法，调用赋值:这里就要求实体严格遵循javabean规范，否则会出错
				//如果没有遵循javabean规范，拿还有一种解决办法，利用注解？？
				ps.getWriteMethod().invoke(obj, rs.getObject(ps.getName()));
			}
			list.add(obj);
		}
		return  list;
	}

}
